package plp.functional2.primitive;

import plp.expressions2.expression.Expressao;
import plp.expressions2.expression.Id;
import plp.expressions2.expression.ValorBooleano;
import plp.expressions2.memory.AmbienteCompilacao;
import plp.expressions2.memory.AmbienteExecucao;
import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;

public class While implements Primitiva {
	private Primitiva corpo;
	private Expressao condicao;

	public While(Primitiva corpo, Expressao condicao) {
		super();
		this.corpo = corpo;
		this.condicao = condicao;
	}

	public void executar(AmbienteExecucao amb)
			throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
		while (((ValorBooleano) condicao.avaliar(amb)).valor()) {
			corpo.executar(amb);
		}
	}

	public boolean checaTipo(AmbienteCompilacao amb)
			throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
		return condicao.getTipo(amb).eBooleano();
	}

	public void setIdProcess(Id idProcess) {
		// TODO Auto-generated method stub
	}

	public Primitiva getCorpo() {
		return corpo;
	}

	public void setCorpo(Primitiva corpo) {
		this.corpo = corpo;
	}

	public Expressao getCondicao() {
		return condicao;
	}

	public void setCondicao(Expressao condicao) {
		this.condicao = condicao;
	}
}
